package com.cscec.omega.utils;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.net.URLEncoder;

public class FileUtil {

    private static Logger logger = LoggerFactory.getLogger(FileUtil.class);

    /**
     * 文件上传至系统目录
     * @param path
     * @return
     */
    public static boolean upload(String path){
        File file = new File(path);
        boolean result = true;
        try {
            createFile(file);
        }catch (Exception e) {
            logger.error("创建文件错误", e);
            result = false;
        }
        return result;
    }

    /**
     * 下载文件
     * @param response
     * @param path
     */
    public static boolean downLoad(HttpServletResponse response, String path){
        boolean result = true;
        try{
            File file = new File(path);
            // 清空response
            response.reset();
            // 设置response的Header
            response.setCharacterEncoding("UTF-8");
            //Content-Disposition的作用：告知浏览器以何种方式显示响应返回的文件，用浏览器打开还是以附件的形式下载到本地保存
            //attachment表示以附件方式下载   inline表示在线打开   "Content-Disposition: inline; filename=文件名.mp3"
            // filename表示文件的默认名称，因为网络传输只支持URL编码的相关支付，因此需要将文件名URL编码后进行传输,前端收到后需要反编码才能获取到真正的名称
            response.addHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(file.getName(), "UTF-8"));

            InputStream is = new FileInputStream(file);
            ServletOutputStream outputStream = response.getOutputStream();
            byte[] b = new byte[1024];
            int len;
            //从输入流中读取一定数量的字节，并将其存储在缓冲区字节数组中，读到末尾返回-1
            while ((len = is.read(b)) > 0) {
                outputStream.write(b, 0, len);
            }
        } catch (UnsupportedEncodingException e) {
            logger.error("UnsupportedEncodingException: ", e);
            result = false;
        } catch (IOException e) {
            logger.error("IOException: ", e);
            result = false;
        }
        return result;
    }

    /**
     * 删除文件
     * @param path
     * @return
     */
    public static boolean delete(String path){
        boolean result = true;
        try{
            File file = new File(path);
            if (file.exists()){
                file.delete();
            }
        }catch (Exception e) {
            logger.error("删除文件错误：", e);
            result = false;
        }
        return result;
    }

    /**
     * 文件目录及文件是否存在，不存在则创建
     * @param file
     */
    private static void createFile(File file){
        if (!file.exists()){
            logger.info("create file: {}", file.toPath());
            file.mkdirs();
        }
    }
}
